package com.bill.concurrency.example.singleton;

import com.bill.concurrency.annotations.NotThreadSafe;
import com.bill.concurrency.annotations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

/**
 * 构建一个单例类。
 * 双重同步锁单例模式。
 * 加入了volatile后，对于instance对象构建时，就不会发生指令重排了。
 */
@Slf4j
@ThreadSafe
public class SingletonExample5 {
    //单例对象
    private static volatile SingletonExample5 instance=null;
    /**
     * 私有构造器，一定要有。
     */
    private SingletonExample5(){

    }


    /**
     * 静态工厂方法。
     * 通过加入Synchronized 加入并发控制，构建线程安全的对象
     * 使用双重检测+锁 机制。
     *
     * @return
     */
    public static SingletonExample5 getInstance(){
        //双重检测机制
        if (instance==null){
            //同步锁
            synchronized (SingletonExample5.class){
                if(instance==null){
                    instance=new SingletonExample5();
                }
            }

        }
        return instance;
    }
}
